import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken, removeToken } from '@/utils/auth'

const errorCode = {
  '401': '认证失败，无法访问系统资源',
  '403': '当前操作没有权限',
  '404': '访问资源不存在',
  'default': '系统未知错误，请反馈给管理员'
}

export const appBaseUrl = process.env.VUE_APP_BASE_API + '/adm';

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: appBaseUrl,
  // 超时
  timeout: 60000
})
// request拦截器
service.interceptors.request.use(config => {
  // 是否需要设置 token
  const useToken = (config.headers || {}).useToken !== false
  if (useToken && getToken()) {
    config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  //后端url统一后缀 /adm
  //config.url = config.url.startsWith('/')? '/adm' + config.url : '/adm/' + config.url ;

  return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

function messageTip(msg, duration, showClose){
  duration = duration?duration:5 * 1000;
  showClose = showClose===false?false:true;
  Message({message: msg, type: 'error', duration: duration, showClose: showClose})
}

// 响应拦截器
service.interceptors.response.use(res => {

    //actuator监控数据不做处理
    if(res.config.url && res.config.url.indexOf('/actuator/')>-1){
      return res.data;
    }

    const response = res.data;
    if(!response){
      messageTip('请求未响应结果！')
      return Promise.reject(response);
    }
    // 未设置状态码则默认成功状态
    const code = response.code||response.code===0? response.code : 1001;
    // 获取错误信息
    const msg = response.msg || errorCode[code] || errorCode.default;
    if (code === 4001) {
    		removeToken();
        location.replace('/index');
        messageTip("您未登录，请先登录！")
        return Promise.reject(response)
    } else if (code !== 1000 || !response.success) {
        messageTip(msg)
        return Promise.reject(response)
    }
    return response;
  },
  (error) => {
    if (!error.response) {
      messageTip("服务器无响应")
  	}else{
      switch (error.response.status) {
          case 401:// 401 未登录，清除token信息并跳转到登录页面
            removeToken();
            location.replace('/index');
            messageTip("登录超时，请重新登录！");break;
          case 403:// 403 没有权限
            messageTip("没有权限，请联系管理员授权！");break;
          case 404:
            messageTip("请求的地址无效！");break;
        	case 500:// 500,服务器连接失败
       				let msg = error.response.data.msg || '系统错误';
              messageTip(msg + ", 请稍后重试!");break;
          default:
            messageTip(error.response.status + " , " + error.response.data.msg);break;
      }
    }
    return Promise.reject(error)   // 返回接口返回的错误信息
	}
)

export default service
